home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / dev / misc / IOBlixDevKitR4.lha / IOBlixDevKit / C / include / ioblix / smc91c96.h < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-05  |  12.5 KB  |  224 lines

  1. /*
  2. **      $VER: ioblix/smc91c96.h 37.3 (03.04.2000)
  3. **
  4. **      include file for access to EtherNet chip
  5. **
  6. **      (C) Copyright 1998-2000 Thore Böckelmann
  7. **      All Rights Reserved.
  8. */
  9.  
  10. #ifndef IOBLIX_SMC91C96_H
  11. #define IOBLIX_SMC91C96_H 1
  12.  
  13. #define ETHER_REG0      0
  14. #define ETHER_REG1      1
  15. #define ETHER_REG2      2
  16. #define ETHER_REG3      3
  17. #define ETHER_REG4      4
  18. #define ETHER_REG5      5
  19. #define ETHER_REG6      6
  20. #define ETHER_REG7      7
  21. #define ETHER_REG_COUNT 8
  22.  
  23. /*
  24.     The old static structures are now obsolete now and have been completely erased.
  25.     These new definitions allow a much more hardware independent way to access different,
  26.     but very similar chips (ie serial UARTs 16C650 and 16C654, which have the same registers,
  27.     but at different addresses.
  28. */
  29.  
  30. struct EthernetRegisters {
  31.     ULONG er_RegCount;
  32.     volatile UWORD *er_Regs[ETHER_REG_COUNT];
  33. };
  34.  
  35. #define bank_select         er_Regs[ETHER_REG7]
  36.  
  37. /* Bank 0 Register */
  38. #define b0_tcr              er_Regs[ETHER_REG0]             /* transmit control register                    */
  39. #define b0_eph_status       er_Regs[ETHER_REG1]
  40. #define b0_rcr              er_Regs[ETHER_REG2]
  41. #define b0_counter          er_Regs[ETHER_REG3]
  42. #define b0_mir              er_Regs[ETHER_REG4]
  43. #define b0_mcr              er_Regs[ETHER_REG5]
  44.  
  45. #define TCR_CLEAR           0x0000                          /* do NOTHING                                   */
  46. #define TCR_TXENABLE        0x0100                          /* if this is 1, we can transmit                */
  47. #define TCR_LOOP            0x0200                          /* local loopback                               */
  48. #define TCR_FORCOL          0x0400                          /* Force Collision on next TX */
  49. #define TCR_PAD_ENABLE      0x8000                          /* pads short packets to 64 bytes               */
  50. #define TCR_NOCRC           0x0001                          /* don't append CRC to transmitted packets      */
  51. #define TCR_MON_CNS         0x0004                          /* monitors the carrier status                  */
  52. #define TCR_FDUPLX          0x0008                          /* receive packets sent out                     */
  53. #define TCR_STP_SQET        0x0010                          /* stop transmitting if Signal quality error    */
  54. #define TCR_EPH_LOOP        0x0020                          /* internal loopback at EPH block               */
  55. #define TCR_FDSE            0x0080                          /* full duplex switch EtherNet                  */
  56. #define TCR_NORMAL          (TCR_TXENABLE | TCR_PAD_ENABLE)
  57.  
  58. #define ES_TX_SUC           0x0100                          /* transmit successfull                         */
  59. #define ES_SNGLCOL          0x0200                          /* single collision detected                    */
  60. #define ES_MULCOL           0x0400                          /* multiple collisions detected                 */
  61. #define ES_LTX_MULT         0x0800                          /* last frame was multicast                     */
  62. #define ES_16COL            0x1000                          /* 16 collisions reached                        */
  63. #define ES_SQET             0x2000                          /* single quality error test                    */
  64. #define ES_LTX_BRD          0x4000                          /* last frame was broadcast                     */
  65. #define ES_TX_DEFR          0x8000                          /* transmit deferred                            */
  66. #define ES_WAKEUP           0x0001                          /* received packet had Magic Packet sig         */
  67. #define ES_LATCOL           0x0002                          /* late collision detected                      */
  68. #define ES_LOST_CARR        0x0004                          /* lost carrier sense                           */
  69. #define ES_EXC_DEF          0x0008                          /* excessive deferral                           */
  70. #define ES_CTR_ROL          0x0010                          /* counter roll over                            */
  71. #define ES_RX_OVRN          0x0020                          /* receive FIFO overrun                         */
  72. #define ES_LINK_OK          0x0040                          /* is the link integrity ok ?                   */
  73. #define ES_TX_UNRN          0x0080                          /* transmit underrun                            */
  74.  
  75. #define RCR_CLEAR           0x0000                          /* set it to a base state                       */
  76. #define RCR_RX_ABORT        0x0100                          /* receive frame aborted                        */
  77. #define RCR_PROMISC         0x0200                          /* enable promiscuous mode                      */
  78. #define RCR_ALMUL           0x0400                          /* receive all multicast packets                */
  79. #define RCR_RXENABLE        0x0001                          /* IFF this is set, we can receive packets      */
  80. #define RCR_STRIP_CRC       0x0002                          /* strips CRC                                   */
  81. #define RCR_FILT_CARR       0x0040                          /* filter carrier                               */
  82. #define RCR_SOFTRESET       0x0080                          /* resets the chip                              */
  83. // #define RCR_NORMAL          (RCR_STRIP_CRC | RCR_RXENABLE)  /* the normal settings for the RCR register :   */
  84. #define RCR_NORMAL          (RCR_RXENABLE)                  /* the normal settings for the RCR register :   */
  85.  
  86. #define CTR_EXCDEF_TX_MASK  0x00f0                          /* exc. deferred tx counter mask                */
  87. #define CTR_DEF_TX_MASK     0x000f                          /* deferred tx counter mask                     */
  88. #define CTR_MULTCOLL_MASK   0xf000                          /* multiple collision counter mask              */
  89. #define CTR_SINGCOLL_MASK   0x0f00                          /* single collision counter mask                */
  90.  
  91. /* Bank 1 Register */
  92. #define b1_config           er_Regs[ETHER_REG0]
  93. #define b1_base             er_Regs[ETHER_REG1]
  94. #define b1_addr0            er_Regs[ETHER_REG2]
  95. #define b1_addr1            er_Regs[ETHER_REG3]
  96. #define b1_addr2            er_Regs[ETHER_REG4]
  97. #define b1_general          er_Regs[ETHER_REG5]
  98. #define b1_control          er_Regs[ETHER_REG6]
  99.  
  100. #define CFG_INT_0           0x0000
  101. #define CFG_INT_1           0x0200
  102. #define CFG_INT_2           0x0400
  103. #define CFG_INT_3           0x0600
  104. #define CFG_DIS_LINK        0x4000                          /* Disable 10BaseT Link Test */
  105. #define CFG_EN16            0x8000
  106. #define CFG_AUI_SELECT      0x0001                          /* Use external (AUI) Transceiver */
  107. #define CFG_SET_SQLSH       0x0002
  108. #define CFG_FULLSTEP        0x0004                          /* AUI signalling mode */
  109. #define CFG_NOWAIT          0x0010
  110. #define CFG_MII_SELECT      0x0080
  111.  
  112. #define CTL_STORE           0x0100                          /* store registers in EEPROM                    */
  113. #define CTL_RELOAD          0x0200                          /* load registers from EEPROM                   */
  114. #define CTL_EEPROM_SEL      0x0400
  115. #define CTL_TE_ENABLE       0x2000                          /* transmit error enable                        */
  116. #define CTL_CR_ENABLE       0x4000                          /* counter roll over enable                     */
  117. #define CTL_LE_ENABLE       0x8000                          /* link error enable                            */
  118. #define CTL_AUTO_RELEASE    0x0008                          /* automatically release successful pages       */
  119. #define CTL_WAKEUP_EN       0x0010                          /* enable auto wakeup in powerdown mode         */
  120. #define CTL_POWERDOWN       0x0020                          /* put chip in powerdown mode                   */
  121. #define CTL_RCV_BAD         0x0040                          /* receive bad CRC packets                      */
  122. #define CTL_EPROM_ACCESS    0x0300                          /* high if Eprom is being read                  */
  123.  
  124. /* Bank 2 Register */
  125. #define b2_mmu_cmd          er_Regs[ETHER_REG0]
  126. #define b2_pnr_arr          er_Regs[ETHER_REG1]
  127. #define b2_fifo_ports       er_Regs[ETHER_REG2]
  128. #define b2_pointer          er_Regs[ETHER_REG3]
  129. #define b2_data1            er_Regs[ETHER_REG4]
  130. #define b2_data2            er_Regs[ETHER_REG5]
  131. #define b2_interrupt        er_Regs[ETHER_REG6]
  132. #define b2_int_mask         er_Regs[ETHER_REG6]
  133.  
  134. #define MC_NOP              0x0000
  135. #define MC_BUSY             0x0100                          /* only readable bit in the register            */
  136. #define MC_ALLOC            0x2000                          /* or with number of 256 byte packets           */
  137. #define MC_RESET            0x4000                          /* reset MMU                                    */
  138. #define MC_REMOVE           0x6000                          /* remove the current rx packet                 */
  139. #define MC_RELEASE          0x8000                          /* remove and release the current rx packet     */
  140. #define MC_FREEPKT          0xA000                          /* Release packet in PNR register               */
  141. #define MC_ENQUEUE          0xC000                          /* Enqueue the packet for transmit              */
  142. #define MC_RESET_TX         0xE000                          /* reset tx FIFOs                               */
  143.  
  144. #define PA_FAILED           0x0080
  145. #define PA_ALLOC_MASK       0x007f                          /* mask for packet number at tx area            */
  146. #define PA_PNUM_MASK        0x7f00                          /* mask for allocated packet number             */
  147.  
  148. #define FP_RXEMPTY          0x0080                          /* rx FIFO empty                                */
  149. #define FP_TXEMPTY          0x8000                          /* tx FIFO empty                                */
  150. #define FP_RXFIFO_MASK      0x001f                          /* mask for rx FIFO packet number               */
  151. #define FP_TXDONE_MASK      0x1f00                          /* mask for tx done packet number               */
  152.  
  153. #define PTR_EARLY_EN        0x0010                          /* enable early transmit                        */
  154. #define PTR_READ            0x0020
  155. #define PTR_AUTOINC         0x0040
  156. #define PTR_RCV             0x0080
  157.  
  158. #define IM_RCV_INT          0x01
  159. #define IM_TX_INT           0x02
  160. #define IM_TX_EMPTY_INT     0x04
  161. #define IM_ALLOC_INT        0x08
  162. #define IM_RX_OVRN_INT      0x10
  163. #define IM_EPH_INT          0x20
  164. #define IM_ERCV_INT         0x40                           /* not on SMC9192 */
  165. #define IM_TX_IDLE_INT      0x80
  166. #define IM_INTERRUPT_MASK   (IM_EPH_INT | IM_RX_OVRN_INT | IM_RCV_INT)
  167.  
  168. #define AllocPages(ec, num) *(ec)->b2_mmu_cmd = (MC_ALLOC | ((num) << 8))
  169.  
  170. /* Bank 3 Register */
  171. #define b3_multicast1       er_Regs[ETHER_REG0]
  172. #define b3_multicast2       er_Regs[ETHER_REG1]
  173. #define b3_multicast3       er_Regs[ETHER_REG2]
  174. #define b3_multicast4       er_Regs[ETHER_REG3]
  175. #define b3_mgmt             er_Regs[ETHER_REG4]
  176. #define b3_revision         er_Regs[ETHER_REG5]
  177. #define b3_ercv             er_Regs[ETHER_REG6]
  178.  
  179. #define SelectBank(ec, bank) *(ec)->bank_select = (bank << 8)
  180. #define GetBank(ec)         ((*(ec)->bank_select >> 8) & 0x000f)
  181.  
  182. #define EtherDelay(ec)      { UWORD scratch; scratch = *(ec)->b0_rcr; scratch = *(ec)->b0_rcr; scratch = *(ec)->b0_rcr; }
  183.  
  184. #define AckIRQ(ec, x)       *(ec)->b2_int_mask = (*(ec)->b2_int_mask & 0x00ff) | ((x) << 8)
  185. #define GetIRQ(ec)          ((*(ec)->b2_int_mask & 0xff00) >> 8)
  186.  
  187. #define SetIRQMask(ec, x)   *(ec)->b2_int_mask = (x)
  188. #define GetIRQMask(ec)      (*(ec)->b2_int_mask & 0x00ff)
  189.  
  190. #define EnableIRQ(ec, x)    *(ec)->b2_int_mask |= (x)
  191. #define DisableIRQ(ec, x)   *(ec)->b2_int_mask &= ~(x)
  192.  
  193. /* Transmit status bits */
  194. #define TS_SUCCESS          0x0001
  195. #define TS_16COL            0x0010
  196. #define TS_SQET             0x0020
  197. #define TS_LATCOL           0x0200
  198. #define TS_LOSTCAR          0x0400
  199.  
  200. /* Receive status bits */
  201. #define RS_MULTICAST        0x0100
  202. #define RS_HASH_MASK        0x7e00
  203. #define RS_TOOSHORT         0x0004
  204. #define RS_TOOLONG          0x0008
  205. #define RS_ODDFRAME         0x0010
  206. #define RS_BADCRC           0x0020
  207. #define RS_BROADCAST        0x0040
  208. #define RS_ALGNERR          0x0080
  209. #define RS_ERRORS           (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT)
  210.  
  211. /* The control byte has the following significant bits.
  212.  * For transmit, the CTLB_ODD bit specifies whether an extra byte
  213.  * is present in the frame.  Bit 0 of the byte count field is
  214.  * ignored.  I just pad every frame to even length and forget about
  215.  * it.
  216.  */
  217. #define CTLB_CRC            0x10 /* Add CRC for this packet (TX only) */
  218. #define CTLB_ODD            0x20 /* The packet length is ODD */
  219.  
  220. #define INVALID_MAC_ADDRESS "\x00\x00\x00\x00\x00\x00"
  221.  
  222. #endif /* IOBLIX_SMC91C96_H */
  223.  
  224.